package com.sai.homework;

import java.util.Scanner;

/**
 * 使用二维数组和循环实现五子棋游戏棋盘的绘制
 */

public class ChessBoardPrintTest {

    int[][] chessBoard = new int[16][16];

    public void paint() {
        for (int i = 0; i < 17; i++) {
            if (0 == i) {
                System.out.print("  ");
            } else {
                // 按照十六进制的格式打印i-1的数值
                System.out.printf("%x ", i - 1);
            }
        }
        System.out.println();

        // 2.2 绘制棋盘中除了第一行之外的其它部分以及行坐标信息
        for (int i = 0; i < 16; i++) {
            // 用于打印行坐标信息
            System.out.printf("%x ", i);
            for (int j = 0; j < 16; j++) {
                // 设定1时为黑棋，2时为白棋，0时为+
                if (0 == chessBoard[i][j]) {
                    System.out.print("+ ");
                } else if (1 == chessBoard[i][j]) {
                    System.out.print("● ");
                } else {
                    System.out.print("○ ");
                }
            }
            // 打印完毕一行的所有内容之后进行换行
            System.out.println();
        }
    }
    //自定义成员方法实现游戏的进行

    public void play() {
        //黑白双方进行切换下棋次序
        boolean b1 = true;

        while (true) {
            paint();
            System.out.println("请" + (b1 ? "黑色方" : "白色方") + "落棋，坐标是(x,y)：");
            Scanner sc = new Scanner(System.in);
            int ix = sc.nextInt();
            int iy = sc.nextInt();

            if (true == b1) {
            chessBoard[ix][iy] = 1;
            }else {chessBoard[ix][iy] = 2;}

            if(judge(ix,iy)) {
                System.out.println((b1 ? "黑色方" : "白色方") + "获得胜利!");
                break;
            }

            b1 = !b1;
        }
    }

    public boolean judge(int ix, int iy) {

        //竖向进行统计同色棋子数量
        int count = 1;
        //向上统计
        for (int i = ix - 1; i >= 0; i--) {
            // 若当前点代表的棋子与上述某个点代表的棋子不一样，则向上统计结束
            if (chessBoard[ix][iy] != chessBoard[i][iy]) {
                break;
            }
            count++;
        }
        //向下统计
        for (int i = ix + 1; i <= 15; i++) {
            if (chessBoard[ix][iy] != chessBoard[i][iy]) {
                break;
            }
            count++;
        }
        //判断
        if (5 == count) {
            return true;
        }

        //横向统计同色棋子数量
        count = 1;
        //向左统计
        for (int j = iy - 1; j >= 0; j--) {
            // 若当前点代表的棋子与上述某个点代表的棋子不一样，则向上统计结束
            if (chessBoard[ix][iy] != chessBoard[ix][j]) {
                break;
            }
            count++;
        }
        //向右统计
        for (int j = iy + 1; j <= 15; j++) {
            if (chessBoard[ix][iy] != chessBoard[ix][j]) {
                break;
            }
            count++;
        }
        //判断
        if (5 == count) {
            return true;
        }

        //左斜上到右斜下统计同色棋子数量
        count = 1;
        //左斜上统计
        for (int i = ix-1, j = iy - 1; i >= 0 && j >= 0; i--, j--) {
            // 若当前点代表的棋子与上述某个点代表的棋子不一样，则向上统计结束
            if (chessBoard[ix][iy] != chessBoard[i][j]) {
                break;
            }
            count++;
        }
        //右斜下统计
        for (int i = ix+1, j = iy + 1; i <= 15 && j <= 15; i++, j++) {
            if (chessBoard[ix][iy] != chessBoard[i][j]) {
                break;
            }
            count++;
        }
        //判断
        if (5 == count) {
            return true;
        }

        //左斜下到右斜上的统计同色棋子数量
        count = 1;
        //右斜上统计
        for (int i = ix-1, j = iy + 1; i >= 0 && j <= 15; i--, j++) {
            // 若当前点代表的棋子与上述某个点代表的棋子不一样，则向上统计结束
            if (chessBoard[ix][iy] != chessBoard[i][j]) {
                break;
            }
            count++;
        }
        //左斜下统计
        for (int i = ix+1, j = iy - 1; i <= 15 && j >= 0; i++, j--) {
            if (chessBoard[ix][iy] != chessBoard[i][j]) {
                break;
            }
            count++;
        }
        //判断
        if (5 == count) {
            return true;
        }

        return false;
    }



    public static void main(String[] args) {

        // 创建下棋游戏并且打印棋盘
        ChessBoardPrintTest c1 = new ChessBoardPrintTest();
        c1.paint();

        // 2.开始游戏
        c1.play();
    }
}
